package crawling;

import data.DocumentCollection;
import data.Seed;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;

/**
 * Crawler adalah kelas abstrak bagi crawler, tugas dari crawler adalah manyuplai
 * document collection dengan document dari seed yang diberikan
 * @author Robert Gunawan
 */
public abstract class Crawler {

    /**
     * mengisikan jumlah document yang dicrawl
     */
    public void setCrawledCount(Integer crawledCount) {
        this.crawledCount = crawledCount;
    }

    /**
     * mengisikan antrian document collection
     * @param documentCollections antrian document collection
     */
    public void setDocumentCollections(Queue<DocumentCollection> documentCollections) {
        this.documentCollections = documentCollections;
    }

    /**
     * mendapatkan jumlah dokumen yang telah dicrawl
     * @return jumlah crawled documents
     */
    public Integer getCrawledCount() {
        return crawledCount;
    }

    /**
     * mengembalikan antrian document collection
     * @return antrian document collection
     */
    public Queue<DocumentCollection> getDocumentCollections() {
        return documentCollections;
    }

    /**
     * mengembalikan dokumen collection dari antrian
     * @return document collection
     */
    public DocumentCollection getDocument() {
        return documentCollections.poll();
    }

    /**
     * menandai semua document collection bahwa proses crawling telah selesai
     */
    public void allFinish() {
        for (DocumentCollection docCollection : documentCollections) {
            docCollection.setIsFinishedCollecting(true);
        }
    }

    /**
     * menambahkan document collection untuk disuplai oleh crawler
     * @param collection document collection
     */
    public void addDocument(DocumentCollection collection) {
        documentCollections.add(collection);
    }
    /**
     * antrian document collection yang disuplai oleh crawler
     */
    private Queue<DocumentCollection> documentCollections = new LinkedList<DocumentCollection>();
    /**
     * jumlah dokumen yang dicrawl
     */
    private Integer crawledCount = 0;

    /**
     * melakukan crawling
     * @param seed root seed
     * @param seedNameFilter filter bagi seed yang tidak akan diproses
     */
    public abstract void crawl(Seed seed, ArrayList<String> seedNameFilter);
}
